/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package servidorRMI;

import interfaces.ControlaJogo;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import model.Jogador;
import model.ListaJogadores;
import model.Peao;
import model.Propriedades;
import model.T;
import state.implementacoes.Comprando;
import state.implementacoes.Confirmado;
import strategy.modelos.Campo;

/**
 *
 * @author Lucas
 * classe que implementa o observer...
 */
public class ControlaObserver implements Observer, Serializable {

    private ControlaJogo controlaJogo = null;
    private ListaJogadores lj;
    private List<Peao> listaPeao;
    private boolean jogoComecou = false;

    public ControlaObserver(ControlaJogo cj) {
        this.controlaJogo = cj;
        listaPeao = new ArrayList<Peao>();
        lj = ListaJogadores.getInstancia();
    }

    @Override
    public void update(Observable o, Object arg) {
        try {
            if (!jogoComecou) {
                controlaJogo.jogadoresLista(listaJogadores()); // APENAS UMA STRING com os jogadores...
                if (lj.todosTrue()) {
                    controlaJogo.liberarTela(true);
                    jogoComecou = true;
                    controlaJogo.vesdeJogada(lj.jogadorVez().getName());
                    controlaJogo.listaPeao(mandarListaPeao());
                }
            } else {
                controlaJogo.listaPeao(mandarListaPeao());
                if (arg != null) {
                    String str[] = arg.toString().split("-");
                    switch (str[0]) {
                        case T.VEZ:
                            if (!alguemComprando()) {
                                controlaJogo.vesdeJogada(lj.jogadorVez().getName());
                            }
                            break;
                        case T.MENSAGEM:
                            controlaJogo.mensagem(str[1], str[2]);
                            break;
                        case T.COMPRAR:
                            controlaJogo.comprar(str[1], str[2]);
                            break;
                        case T.OFERTA:
                            controlaJogo.intensaoCompra(str[1], str[2], str[3], str[4]);
                            break;
                        default:
                            System.out.println("Swuit erro");
                    }
                }
            }
        } catch (Exception e) {
            System.out.println("[Erro]: " + " Observador: " + o.toString() + " " + e.getMessage());
        }
    }

    /*
     * Pega a lista de jogadores no começo do jogo...
     */
    private String listaJogadores() {
        String listaStr = "";
        for (Jogador jogador : lj.getListaJogadores()) {
            listaStr += "Jogador: " + jogador.getName() + " Status: ("
                    + (jogador.getState() instanceof Confirmado ? "Confirmado" : "Esperando") + ") \n";
        }
        return listaStr;
    }

    /*
     * Manda lista de peao para que o mesmo seja montado do lado do cliente..
     */
    private List mandarListaPeao() {
        listaPeao = new ArrayList<Peao>();
        Peao peao;
        List<Propriedades> listaCampos = new ArrayList<Propriedades>();
        Propriedades p;
        for (Jogador jog : lj.getListaJogadores()) {
            peao = new Peao();
            peao.setCor(jog.getColor());
            peao.setPositon(jog.getLocal());
            peao.setDinheiros(jog.getMoney());
            peao.setNome(jog.getName());
            //Pega lista de campos do jogador e popula no peao...
            for (Campo campo : jog.getListaCampos()) {
                p = new Propriedades();
                p.setIdCampo(campo.getIdCampo());
                p.setNumeroCasas(campo.getCasas());
                listaCampos.add(p);
            }
            peao.setListaCampos(listaCampos);
            listaPeao.add(peao);
            listaCampos = new ArrayList<Propriedades>();
        }
        return listaPeao;
    }

    /*
     * Verifica se algum dos jogadores esta comprando o campo
     * que caiu...
     */
    public boolean alguemComprando() {
        for (Jogador j : lj.getListaJogadores()) {
            if (j.getState() instanceof Comprando) {
                return true;
            }
        }
        return false;
    }
}
